home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI3 / LEZIONE7x1.s < prev    next >
Text File  |  1994-11-28  |  7KB  |  267 lines

  1.  
  2. ; Lezione7x1.s    COLLISIONE TRA SPRITE E PLAYFIELD
  3. ;        In questo esempio c'e` uno sprite che attraversa rettangoli
  4. ;        di diversi colori. Quando lo sprite tocca un determinato
  5. ;        colore, si accende un rivelatore.
  6.  
  7.     SECTION    CiriCop,CODE
  8.  
  9. Inizio:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Nome lib
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  17.  
  18. ;    Puntiamo la PIC con il solito metodo
  19.  
  20.     MOVE.L    #PIC,d0
  21.     LEA    BPLPOINTERS,A1
  22.     MOVEQ    #3-1,D1
  23. POINTBP:
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.     swap    d0
  28.     ADD.L    #40*256,d0
  29.     addq.w    #8,a1
  30.     dbra    d1,POINTBP
  31.  
  32. ;    Puntiamo lo sprite
  33.  
  34.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  35.     MOVE.L    #MIOSPRITE0,d0        ; indirizzo dello sprite in d0
  36.     move.w    d0,6(a1)
  37.     swap    d0
  38.     move.w    d0,2(a1)
  39.     add.l    #16,a1
  40.  
  41.     move.l    #COPPERLIST,$dff080    ; nostra COP
  42.     move.w    d0,$dff088        ; START COP
  43.     move.w    #0,$dff1fc        ; NO AGA!
  44.     move.w    #$c00,$dff106        ; NO AGA!
  45.  
  46. mouse:
  47.     cmpi.b    #$ff,$dff006    ; Linea 255?
  48.     bne.s    mouse
  49.  
  50.     bsr.s    MuoviSprite0    ; Muovi l'aereo
  51.     bsr.s    CheckColl    ; Controlla collisione e provvede
  52.  
  53. Aspetta:
  54.     cmpi.b    #$ff,$dff006    ; linea 255?
  55.     beq.s    Aspetta
  56.  
  57.     btst    #6,$bfe001    ; mouse premuto?
  58.     bne.s    mouse
  59.  
  60.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  61.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  62.  
  63.     move.l    4.w,a6
  64.     jsr    -$7e(a6)    ; Enable
  65.     move.l    gfxbase(PC),a1
  66.     jsr    -$19e(a6)    ; Closelibrary
  67.     rts
  68.  
  69. ;    Dati
  70.  
  71. GfxName:
  72.     dc.b    "graphics.library",0,0
  73.  
  74. GfxBase:
  75.     dc.l    0
  76.  
  77. OldCop:
  78.     dc.l    0
  79.  
  80. ; Questa routine muove lo sprite in linea retta di 2 pixel per volta
  81.  
  82. MuoviSprite0:
  83.     subq.b    #1,HSTART0
  84.     rts
  85.  
  86.  
  87. ; Questa routine controlla se c'e` collisione.
  88. ; In caso affermativo, "accende" il rivelatore di collisione.
  89. ; Il rivelatore e` semplicemente un rettangolo colorato con il COLORE 7.
  90. ; Modificando nella copperlist il valore assunto dal registro COLOR07,
  91. ; si provoca l'accensione (rosso) o lo spegnimento (grigio) del rivelatore.
  92.  
  93. CheckColl:
  94.     move.w    $dff00e,d0    ; legge CLXDAT ($dff00e)
  95.                 ; una lettura di questo registro ne provoca
  96.                 ; anche la cancellazione, per cui conviene
  97.                 ; copiarselo in d0 e fare i test su d0
  98.     move.w    d0,d7
  99.     btst.l    #1,d0        ; il bit 1 indica la collisione tra sprite 0
  100.                 ; e playfield
  101.     beq.s    no_coll        ; se non c'e` collisione salta
  102.  
  103. si_coll:
  104.     move.w    #$f00,rileva_collisione ; "accende" il rivelatore (COLOR07)
  105.                     ; modificando la copperlist (rosso)
  106.     bra.s    exitColl        ; esci
  107.  
  108. no_coll:
  109.     move.w    #$555,rileva_collisione ; "spegne" il rivelatore (COLOR07)
  110.                     ; modificando la copperlist (grigio)
  111. exitColl:
  112.     rts
  113.  
  114.  
  115.  
  116.     SECTION    GRAPHIC,DATA_C
  117.  
  118. COPPERLIST:
  119. SpritePointers:
  120.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  121.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  122.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  123.     dc.w    $13e,0
  124.  
  125.  
  126. ; Questo e` il registro CLXCON (controlla il modo di rilevamento)
  127.  
  128. ; i bit da 0 a 5 sono i valori che devono essere assunti dai plane
  129. ; i bit da 6 a 11 indicano quali planes sono abilitati alle collisioni
  130. ; i bit da 12 a 15 indicano quali degli sprite dispari sono abilitati
  131. ; al rilevamento delle collisioni.
  132.             ;5432109876543210
  133.     dc.w    $98,%0000000111000011    ; CLXCON
  134.  
  135. ; Questi valori indicano che i planes 1,2 e 3 sono attivi per le collisioni, e
  136. ; che viene segnalata collisione quando lo sprite si sovrappone ad un pixel
  137. ; che ha:    plane 1 = 1
  138. ;         plane 2 = 1
  139. ;        plane 3 = 0
  140.  
  141.  
  142.     dc.w    $8E,$2c81    ; DiwStrt
  143.     dc.w    $90,$2cc1    ; DiwStop
  144.     dc.w    $92,$38        ; DdfStart
  145.     dc.w    $94,$d0        ; DdfStop
  146.     dc.w    $102,0        ; BplCon1
  147.  
  148.     dc.w    $104,$0024    ; BplCon2 - mette tutti gli sprite davanti ai
  149.                 ; playfield
  150.  
  151.     dc.w    $108,0        ; Bpl1Mod
  152.     dc.w    $10a,0        ; Bpl2Mod
  153.  
  154.             ; 5432109876543210
  155.     dc.w    $100,%0011001000000000    ; 3 bitplane lowres
  156.  
  157. BPLPOINTERS:
  158.     dc.w $e0,0,$e2,0
  159.     dc.w $e4,0,$e6,0
  160.     dc.w $e8,0,$ea,0
  161.  
  162. ; colori bitplanes
  163.     dc.w    $180,$000    ; color0    ; sfondo nero
  164.     dc.w    $182,$620
  165.     dc.w    $184,$fff
  166.     dc.w    $186,$e00
  167.     dc.w    $188,$808
  168.     dc.w    $18a,$f4a
  169.     dc.w    $18c,$aaa
  170.     dc.w    $18e    ; color07 - il valore caricato in questo registro viene
  171.             ; scritto dalla routine ChekColl a seconda del verifi-
  172.             ; carsi o meno di una collisione.
  173. rileva_collisione:
  174.     dc.w    0    ; IN QUESTO PUNTO la routine CheckColl modifica
  175.             ; la copper list scrivendo il colore giusto.
  176.  
  177. ; colori sprite
  178.     dc.w    $1A2,$00f    ; color17, ossia COLOR1 dello sprite0
  179.     dc.w    $1A4,$0c0    ; color18, ossia COLOR2 dello sprite0
  180.     dc.w    $1A6,$0c0    ; color19, ossia COLOR3 dello sprite0
  181.  
  182.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  183.  
  184.  
  185. ; ************ Ecco lo sprite: OVVIAMENTE deve essere in CHIP RAM! ************
  186.  
  187. MIOSPRITE0:        ; lunghezza 6 linee
  188. VSTART0:
  189.     dc.b 200    ; Posizione verticale di inizio sprite (da $2c a $f2)
  190. HSTART0:
  191.     dc.b $d8    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  192. VSTOP0:
  193.     dc.b 206    ; 200+6=206
  194. VHBITS:
  195.     dc.b $00
  196.     dc.w    $0008,$0000
  197.     dc.w    $1818,$0000
  198.     dc.w    $2C28,$1010
  199.     dc.w    $7FF8,$0000
  200.     dc.w    $3FC0,$0000
  201.     dc.w    $01F0,$0000
  202.     dc.w    $0000,$0000
  203.  
  204. PIC:
  205.     incbin    "collpic.raw"
  206.  
  207.     end
  208.  
  209. In questo esempio mostriamo come rilevare le collisioni tra sprite e plafield.
  210. Come abbiamo gia` visto nella lezione, si usano i due registri CLXDAT e CLXCON.
  211. CLXDAT serve semplicemente per sapere se si e` verificata una collisione e si
  212. usa esattamente come nel caso di collisione tra 2 sprite (solo che ovviamente
  213. si usa un bit diverso). L'uso di CLXCON, invece e` piu` complesso. Vediamolo
  214. bene studiando il nostro esempio. Abbiamo scritto nella copper list: 
  215.  
  216.             ;5432109876543210
  217.     dc.w    $98,%0000000111000011    ; CLXCON
  218.  
  219. I bit da 6 a 11 indicano quali planes sono abilitati alle collisioni. Nel
  220. nostro esempio sono abilitati i planes 1,2,3 (i planes visualizzati). I bit
  221. da 0 a 5 indicano invece i valori che devono essere assunti dai plane affinche`
  222. si verifichi la collisione. Nel nostro esempio la collisione c'e` se i 3 planes
  223. abilitati assumono i seguenti valori: plane 3 = 0, plane 2 = 1, plane 1 = 1,
  224. ovvero la sequenza %011=3. Quidi viene rilevata la collisione tra lo sprite
  225. e il colore 3. Notate che non ha interesse il valore che devono assumere
  226. i planes 4,5 e 6 in quanto sono disabilitati.
  227.  
  228. Modificate ora la copper list come segue:
  229.             ;5432109876543210
  230.     dc.w    $98,%0000000111000010    ; CLXCON
  231.  
  232. Ora i planes abilitati sono sempre 1,2 e 3 ma il valore che devono assumere
  233. e` pari alla sequenza %010, ovvero il colore 2. Potete verificarlo lanciando
  234. il programma. Funziona allo stesso modo per gli altri colori.
  235.  
  236. E se volessimo rilevare la collisione con piu` di 2 colori ?
  237. In certi casi e` possibile farlo non abilitando tutti i piani visualizzati.
  238. Modificate la copper list come segue:
  239.             ;5432109876543210
  240.     dc.w    $98,%0000000110000010    ; CLXCON
  241.  
  242. A differenza di prima, abbiamo abilitato per il rilevamento collisioni
  243. solo i planes 2 e 3. Questo significa che il valore del plane 1 non ha effetto
  244. sul rilevamento delle collisioni. E` necessario solamente che:
  245. plane 3 = 0 e plane 2 = 1. Poiche` cio` si verifica sia per la sequenza
  246. binaria %010 sia per la sequenza %011, entrambe daranno luogo ad una
  247. collisione. In questo modo la collisione avverra` per il colore 2 (%010)
  248. e per il colore 3 (%011).
  249.  
  250. Vediamo un'altro esempio. Modificate la copper list come segue:
  251.             ;5432109876543210
  252.     dc.w    $98,%0000000001000001    ; CLXCON
  253.  
  254. Ora e` abilitato solo il plane 1, e la collisione si verifica quando il
  255. plane 1 = 1. Questo accade per tutti i colori dispari. Si ha infatti:
  256.  
  257.     %001    colore 1
  258.     %011    colore 3
  259.     %101    colore 5
  260.     %111    colore 7
  261.  
  262. In tutte e quattro queste combinazioni il plane 1 vale 1.
  263.  
  264. Tutto cio` che abbiamo detto e` valido anche nel caso di un numero di planes
  265. visualizzati diverso da 3.
  266.  
  267.